package upcweb.dao;

import java.sql.ResultSet;
import java.util.ArrayList;

import upcweb.modelo.ClsAcceso;
import upcweb.util.ClsReturn;

public class AccesosDAO {

	
	SQLProcDAO sql= new SQLProcDAO();
	
	
	public ArrayList<ClsAcceso> getPaginas(){
		ArrayList<ClsAcceso> arr= new ArrayList<ClsAcceso>();
		try {
			ResultSet rs = sql.getData("select * from pages", new Object[]{});
			while(rs.next()){
				ClsAcceso acc= new ClsAcceso();
				acc.setCo_Objeto(rs.getInt("co_page"));
				acc.setNo_Objeto(rs.getString("no_page"));
				acc.setNo_Descripcion(rs.getString("no_descripcion"));
				acc.setAcceso(rs.getInt("fl_acceso"));
				acc.setUrl_Objeto(rs.getString("no_url_page"));
				arr.add(acc);
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println(e.getMessage());
		}
		return arr;
	}
	
	/*
	 * CREATE  TABLE IF NOT EXISTS `upcweb`.`rol_users` (
  `co_rol` INT NOT NULL ,
  `no_usuario` CHAR(15) NOT NULL ,
  INDEX `fk_rol_users_rol1` (`co_rol` ASC) ,
  INDEX `fk_rol_users_usuario1` (`no_usuario` ASC) ,
  CONSTRAINT `fk_rol_users_rol1`
    FOREIGN KEY (`co_rol` )
    REFERENCES `upcweb`.`rol` (`co_rol` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_rol_users_usuario1`
    FOREIGN KEY (`no_usuario` )
    REFERENCES `upcweb`.`usuario` (`no_usuario` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
	 */
	
	public ArrayList<ClsAcceso> getUsersRol(ClsAcceso ac){
		ArrayList<ClsAcceso> arr= new ArrayList<ClsAcceso>();
		try {
			ResultSet rs = sql.getData("select b.no_usuario,c.co_responsable,no_correo,no_responsable,ape_paterno,ape_materno  from rol a inner join  rol_users b on a.co_rol = b.co_rol inner join usuario c on c.no_usuario = b.no_usuario inner join responsablefamilia d on d.co_responsable = c.co_responsable where a.co_rol = ?",
					new Object[]{ac.getCo_Rol()});
			while(rs.next()){
				ClsAcceso acc= new ClsAcceso();
				acc.setNo_user(rs.getString("no_usuario"));
				acc.setNom_responsable(rs.getString("no_responsable")+" "+rs.getString("ape_paterno") + " "+rs.getString("ape_materno"));
				acc.setUsr_mail(rs.getString("no_correo"));
				acc.setCo_responsable(rs.getInt("co_responsable"));
				arr.add(acc);
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println(e.getMessage());
		}
		return arr;
	}
	
	
	public ClsReturn addRol(ClsAcceso ac) {
		// TODO Auto-generated method stub
		ClsReturn ret = new ClsReturn();
		try {
			System.out.println(ac.getAcceso());
			ret = sql.execProc("INSERT INTO rol (`no_rol`) VALUES (?)", new Object[]{ac.getCo_Rol()});
			
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
	public ClsReturn delRol(ClsAcceso ac) {
		// TODO Auto-generated method stub
		ClsReturn ret = new ClsReturn();
		try {
			System.out.println(ac.getAcceso());
			ret = sql.execProc("delete from rol where co_rol = ?", new Object[]{ac.getCo_Rol()});
			
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
	public ArrayList<ClsAcceso> getAccesosRol(ClsAcceso ac){
		ArrayList<ClsAcceso> arr= new ArrayList<ClsAcceso>();
		try {
			ResultSet rs = sql.getData("select *,b.fl_acceso as acceso from pages a inner join accesos_rol b on a.co_page = b.co_page where b.co_rol = ?",
					new Object[]{ac.getCo_Rol()});
			while(rs.next()){
				ClsAcceso acc= new ClsAcceso();
				acc.setCo_Objeto(rs.getInt("co_page"));
				acc.setNo_Objeto(rs.getString("no_page"));
				acc.setAcceso(rs.getInt("acceso"));
				acc.setNo_Descripcion(rs.getString("no_descripcion"));
				//acc.setAcceso(rs.getInt("fl_acceso"));
				acc.setUrl_Objeto(rs.getString("no_url_page"));
				arr.add(acc);
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println(e.getMessage());
		}
		return arr;
	}
	

	public ClsReturn addPagina(ClsAcceso ac) {
		// TODO Auto-generated method stub
		ClsReturn ret = new ClsReturn();
		try {
			System.out.println(ac.getAcceso());
			ret = sql.execProc("{call sp_addObject(?,?,?,?)}", new Object[]{ac.getNo_Objeto(),ac.getUrl_Objeto(),ac.getNo_Descripcion(),ac.getAcceso()});
			
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
	public ClsReturn delPagina(ClsAcceso ac) {
		// TODO Auto-generated method stub
		ClsReturn ret = new ClsReturn();
		try {
			ret = sql.execProc("{call sp_delObject(?)}", new Object[]{ac.getCo_Objeto()});
			
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
	public ArrayList<ClsAcceso> getRoles(){
		ArrayList<ClsAcceso> arr= new ArrayList<ClsAcceso>();
		try {
			ResultSet rs = sql.getData("select *, (select count(*) from rol_users a where a.co_rol = b.co_rol) users  from rol b", new Object[]{});
			while(rs.next()){
				ClsAcceso acc= new ClsAcceso();
				acc.setCo_Rol(rs.getString("co_rol"));
				acc.setNo_Rol(rs.getString("no_rol"));
				acc.setNro_usuarios(rs.getInt("users"));
				arr.add(acc);
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println(e.getMessage());
		}
		return arr;
	}
	
	
	public ClsReturn addPaginaRol(ClsAcceso ac){
		
		ClsReturn ret = new ClsReturn();
		try {
			System.out.println(ac.getAcceso());
			ret = sql.execProc("{call sp_addPageRol(?,?,?)}", new Object[]{ac.getCo_Rol(),ac.getCo_Objeto(),ac.getAcceso()});
			
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
	public ClsReturn delPaginaRol(ClsAcceso ac){
		
		ClsReturn ret = new ClsReturn();
		try {
			System.out.println(ac.getAcceso());
			ret = sql.execProc("delete from accesos_rol where co_rol = ? and co_page = ?", new Object[]{ac.getCo_Rol(),ac.getCo_Objeto()});
			
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
	public ClsReturn chgPaginaRol(ClsAcceso ac){
		
		ClsReturn ret = new ClsReturn();
		try {
			System.out.println(ac.getAcceso());
			ret = sql.execProc("update accesos_rol set fl_acceso = ? where co_rol = ? and co_page = ?", new Object[]{ac.getAcceso(),ac.getCo_Rol(),ac.getCo_Objeto()});
			
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
	public ClsReturn addUserRol(ClsAcceso ac){
		
		ClsReturn ret = new ClsReturn();
		try {
			//System.out.println(ac.getAcceso());
			ret = sql.execProc("INSERT INTO rol_users (co_rol,no_usuario) VALUES (?,?)", new Object[]{ac.getCo_Rol(),ac.getNo_user()});
			
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
	public ClsReturn delUserRol(ClsAcceso ac){
		
		ClsReturn ret = new ClsReturn();
		try {
			//System.out.println(ac.getAcceso());
			ret = sql.execProc("delete from rol_users  where co_rol= ? and no_usuario = ?", new Object[]{ac.getCo_Rol(),ac.getNo_user()});
			
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
	public boolean checkAcceso(ClsAcceso ac){
		System.out.println("Intentando acceder a '" + ac.getUrl_Objeto() + "' como '" + ac.getNo_user() + "'." );
		boolean ret = false;
		try {
			ResultSet rs= sql.getData("{call sp_check_acceso(?,?)}", new Object[]{ac.getNo_user(),ac.getUrl_Objeto()});
			if (rs.next()){
				if (rs.getInt(1)==1){
					return true;
				}
				else {
					return false;
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		System.err.println(e.getMessage());
			
		}		
		return ret;
	}
	

		
}
